package basics

import (
	"fmt"
	"strconv"
)

// ConvertStringNumeric 字符串类型转数值类型
func ConvertStringNumeric() {
	var str1 string = "125"
	// 第一个参数: 需要转换的数据
	//第二个参数: 转换为几进制
	// 第三个参数: 转换为多少位整型
	// 注意点: ParseInt函数会返回两个值, 一个是转换后的结果, 一个是错误
	//如果被转换的数据转换之后没有超出指定的范围或者不能被转换时,
	// 那么错误为nil, 否则错误不为nil
	// 将字符串"125"转换为10进制的int8
	num1, err := strconv.ParseInt(str1, 10, 8)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(num1)

	var str2 string = "150"
	// 将字符串"150"转换为10进制的int8
	// 由于int8的取值范围是-128~127, 所以转换之后超出了指定的范围, error不为nil
	num2, err := strconv.ParseInt(str2, 10, 8)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(num2)

	var str3 string = "3.1234567890123456789"
	// 第一个参数: 需要转换的数据
	// 第二个参数: 转换为多少位小数, 32 or 64
	// ParseFloat同样有两个返回值, 如果能够正常转换则错误为nil, 否则不为nil
	num3, err := strconv.ParseFloat(str3, 32)
	if err != nil {
		// 例如: 把字符串"3.14abc"转换为小数就会报错, 因为"3.14abc"不是一个小数
		fmt.Println(err)
	}
	fmt.Println(num3)

	var str4 string = "true"
	// 第一个参数: 需要转换的数据
	// ParseBool同样有两个返回值, 如果能够正常转换则错误为nil, 否则不为nil
	num4, _ := strconv.ParseBool(str4)
	fmt.Println(num4)

	// 字符串类型转换为数值类型时,如果不能转换除了返回error以外,还会返回对应类型的默认值
	var str5 string = "abc"
	num5, _ := strconv.ParseInt(str5, 10, 32)
	fmt.Println(num5) // 0
	num6, _ := strconv.ParseFloat(str5, 32)
	fmt.Println(num6) // 0
	num7, _ := strconv.ParseBool(str5)
	fmt.Println(num7) // false

	// 看完上面的代码有没有种想打人的感觉?
	//如果有那么请继续往下看 字符串类型和整型快速转换
	var num8 int32 = 110
	// 快速将整型转换为字符串类型
	// 注意:Itoa方法只能接受int类型
	var str9 string = strconv.Itoa(int(num8))
	fmt.Println(str9)
	var str10 string = "666"
	// 快速将字符串类型转换为整型
	// 注意: Atoi方法返回两个值, 一个值是int,一个值是error
	//如果字符串能被转换为int,那么error为nil, 否则不为nil
	num11, err := strconv.Atoi(str10)
	if err != nil {
		fmt.Println(err)
	}
	fmt.Println(num11)

}
